#include <stdio.h>

#define BASE_YEAR	1970

// 函数的声明
/*
 	函数的声明与函数的定义一致，只是不需要函数实现
	注意
		一定要有;
		声明的参数可以不写名字，只声明类型
 */
int is_leap(int year);

int main(void)
{
	int year, month;
	int sumdays = 0;
	int i;
	int first_day;
	int monthdays;

	do {
		printf("输入日期(month/year):");
		scanf("%d/%d", &month, &year);	
	} while(!(month >= 1 && month <= 12) || !(year >= BASE_YEAR));

	// 整年
	for (i = BASE_YEAR; i < year; i++) {
		sumdays += (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) + 365;
	}
	// 1 ~ month
	for (i = 1; i < month; i++) {
		if (1 == i || 3 == i || 5 == i || 7 == i || 8 == i || 10 == i || 12 == i) {
			sumdays += 31;
		} else if (2 == i) {
			sumdays += (year % 4 == 0 && year % 100 != 0 || year % 400 == 0 ? 29 : 28);
		} else {
			sumdays += 30;
		}
	}

	// 1号
	sumdays += 1;
	printf("%d/%d/1距离计算机元年有%d天\n", year, month, sumdays);

	// 1号是星期几 为什么+3 因为我们想将星期几和余数对应起来，而计算机元年的1.1是星期4
	first_day = (sumdays + 3) % 7;
	printf("%d/%d/1是星期%d\n", year, month, first_day);

	// month月有多少天
	if (1 == month || 3 == month || 5 == month || 7 == month ||\
			8 == month || 10 == month || 12 == month)		
		monthdays = 31;
	else if (4 == month || 6 == month || 9 == month || 11 == month)
		monthdays = 30;
	else {
		if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
			monthdays = 29;
		else
			monthdays = 28;
	}

	// year.month.1是星期first_day, month月有monthdays天
	printf("      %d月%d\n", month, year);
	printf("日 一 二 三 四 五 六\n");
	for (i = 0; i < first_day; i++)	
		printf("   ");
	for (i = 1; i <= monthdays; i++) {
		printf("%2d%c", i, (i + first_day) % 7 == 0 ? '\n' : ' ');
	}
	printf("\n");

	return 0;
}

/*
 判断年份是否为闰年
 函数的定义
 	结果返回值类型 函数名is_leap(已知条件参数int year);
 */
int is_leap(int year)
{
	// 函数实现
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
		return 1; // 返回值
	else
		return 0;
}

/*
计算月份的天数
// year是当month是二月必备的
int days_month(int month, int year)
 */
int days_month(int month, int year)
{
	int ret;

	if (1 == month || 3 == month || 5 == month || 7 == month || \
			8 == month || 10 == month || 12 == month)
		ret = 31;
	else if (4 == month || 6 == month || 9 == month || 11 == month)
		ret = 30;
	else if (2 == month) {
	 	// 判断year是否为闰年,调用（使用）闰年的函数	
		/*
		 函数的调用
		 	函数调用的时候，传递的参数仅仅是值的传递，不是变量的传递
			days_month函数参数year与is_leap函数的year没有任何关联，仅仅是名字相同的两个不同变量
			当函数调用，程序会将执行的地址切换到调用函数，当函数结束后的结果值return的值就是函数调用的结果
		 */
		ret = 28 + is_leap(year);
	} else 
		ret = -1;

	return ret;
}





